package com.ruoyi.project.system.service.impl;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson2.JSON;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.AliyunPushConfig;
import com.ruoyi.project.system.service.IAliyunPushService;

/**
 * 阿里云推送服务实现类
 * 
 * @author ruoyi
 */
@Service
public class AliyunPushServiceImpl implements IAliyunPushService {

    private static final Logger log = LoggerFactory.getLogger(AliyunPushServiceImpl.class);

    @Autowired
    private IAcsClient aliyunPushClient;

    @Autowired
    private AliyunPushConfig pushConfig;

    /**
     * 推送通知消息到Android设备
     * 
     * @param title         标题
     * @param body          内容
     * @param deviceId      设备ID(deviceId/alias/account/tag/all)
     * @param target        推送目标类型(DEVICE/ACCOUNT/ALIAS/TAG/ALL)
     * @param targetValue   推送目标值
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToAndroid(String title, String body, String target,
            String targetValue, Map<String, Object> extParameters) {
        try {
            PushRequest request = new PushRequest();
            // 推送目标
            request.setAppKey(Long.valueOf(pushConfig.getAndroidAppKey()));
            request.setTarget(target); // 推送目标: DEVICE:设备; ACCOUNT:账号; ALIAS:别名; TAG:标签; ALL:所有
            request.setTargetValue(targetValue); // 根据Target来设定，多个参数使用逗号分隔，最多1000个

            // 推送配置
            request.setPushType("NOTICE"); // 消息类型 MESSAGE:消息; NOTICE:通知
            request.setDeviceType("ANDROID"); // 设备类型 ANDROID/iOS/ALL
            request.setTitle(title); // 消息标题
            request.setBody(body); // 消息内容

            // 设置额外参数
            if (extParameters != null && !extParameters.isEmpty()) {
                request.setAndroidExtParameters(JSON.toJSONString(extParameters));
            }

            // 设置通知的展开类型 NONE:标准; CUSTOM:自定义
            request.setAndroidNotifyType("NONE");
            // 通知栏自定义铃声（不设置使用SDK默认铃声）
            // request.setAndroidMusic("default");
            // 在客户端通知栏显示的通知内容
            // request.setAndroidPopupActivity("com.ali.demo.PopupActivity");

            // 设置通知的提醒方式: 声音; 震动; 呼吸灯
            request.setAndroidNotificationBarType(1);
            // 设置通知的扩展属性
            request.setAndroidNotificationChannel("aaa");

            // 设置离线消息保存时间，单位：秒
            request.setStoreOffline(true);
            // 设置过期时间，使用ISO8601格式
            java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
            java.util.Calendar calendar = java.util.Calendar.getInstance();
            calendar.add(java.util.Calendar.DATE, 7); // 7天后过期
            request.setExpireTime(df.format(calendar.getTime()));

            PushResponse response = aliyunPushClient.getAcsResponse(request);
            log.info("推送结果: {}", JSON.toJSONString(response));
            return response;
        } catch (ClientException e) {
            log.error("阿里云推送异常: {}", e.getMessage(), e);
            throw new RuntimeException("推送消息失败：" + e.getMessage());
        } catch (Exception e) {
            log.error("系统异常: {}", e.getMessage(), e);
            throw new RuntimeException("系统异常：" + e.getMessage());
        }
    }

    /**
     * 推送通知消息到所有设备
     * 
     * @param title         标题
     * @param body          内容
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToAll(String title, String body, Map<String, Object> extParameters) {
        return pushMessageToAndroid(title, body, "ALL", "ALL", extParameters);
    }

    /**
     * 推送通知消息到指定设备
     * 
     * @param deviceId      设备ID
     * @param title         标题
     * @param body          内容
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToDevice(String deviceId, String title, String body,
            Map<String, Object> extParameters) {
        if (StringUtils.isEmpty(deviceId)) {
            throw new RuntimeException("设备ID不能为空");
        }
        return pushMessageToAndroid(title, body, "DEVICE", deviceId, extParameters);
    }

    /**
     * 推送通知消息到指定别名
     * 
     * @param alias         别名
     * @param title         标题
     * @param body          内容
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToAlias(String alias, String title, String body,
            Map<String, Object> extParameters) {
        if (StringUtils.isEmpty(alias)) {
            throw new RuntimeException("别名不能为空");
        }
        return pushMessageToAndroid(title, body, "ALIAS", alias, extParameters);
    }

    /**
     * 推送通知消息到指定账号
     * 
     * @param account       账号
     * @param title         标题
     * @param body          内容
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToAccount(String account, String title, String body,
            Map<String, Object> extParameters) {
        if (StringUtils.isEmpty(account)) {
            throw new RuntimeException("账号不能为空");
        }
        return pushMessageToAndroid(title, body, "ACCOUNT", account, extParameters);
    }

    /**
     * 推送通知消息到指定标签
     * 
     * @param tag           标签
     * @param title         标题
     * @param body          内容
     * @param extParameters 额外参数，JSON格式
     * @return 推送结果
     */
    @Override
    public PushResponse pushMessageToTag(String tag, String title, String body,
            Map<String, Object> extParameters) {
        if (StringUtils.isEmpty(tag)) {
            throw new RuntimeException("标签不能为空");
        }
        return pushMessageToAndroid(title, body, "TAG", tag, extParameters);
    }
}